Časť kód :
#include "mainwindow.h" #include "ui_mainwindow.h" #ifdef Q_OS_WIN #include <windows.h> // for Sleep #endif #define OPT_CLR 0 #define OPT_PUT 1 #define OPT_SAV 2 #define SMER_NONE 0 #define SMER_LEFT 1 #define SMER_RIGHT 2 #define SMER_OTOCR 3 #define SMER_OTOCL 4 #define TO_LEV 24 // kolko riadkov ma level #define COLOR_UNDEF -1 // nedefinovana farba const int CUBE[7][4][4] = {{{0,0,0,0}, // kocka {0,1,1,0}, {0,1,1,0}, {0,0,0,0}}, {{0,1,0,0}, // dlhe I {0,1,0,0}, {0,1,0,0}, {0,1,0,0}}, {{0,1,0,0}, // opacne T {0,1,1,0}, {0,1,0,0}, {0,0,0,0}}, {{0,0,0,0}, // Z vpravo {0,1,1,0}, {1,1,0,0}, {0,0,0,0}}, {{0,0,0,0}, // Z vlavo {1,1,0,0}, {0,1,1,0}, {0,0,0,0}}, {{0,1,0,0}, // L vpravo {0,1,0,0}, {0,1,1,0}, {0,0,0,0}}, {{0,0,1,0}, // L vlavo {0,0,1,0}, {0,1,1,0}, {0,0,0,0}}}; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { y=0; ui->setupUi(this); icon[0].addFile(QString::fromUtf8(":/obrazky/Resources/green_field.png"), QSize(), QIcon::Normal, QIcon::Off); icon[1].addFile(QString::fromUtf8(":/obrazky/Resources/red_field.png"), QSize(), QIcon::Normal, QIcon::Off); icon[2].addFile(QString::fromUtf8(":/obrazky/Resources/blue_field.png"), QSize(), QIcon::Normal, QIcon::Off); icon[3].addFile(QString::fromUtf8(":/obrazky/Resources/magenta_field.png"), QSize(), QIcon::Normal, QIcon::Off); icon[4].addFile(QString::fromUtf8(":/obrazky/Resources/orange_field.png"), QSize(), QIcon::Normal, QIcon::Off); icon[5].addFile(QString::fromUtf8(":/obrazky/Resources/yellow_field.png"), QSize(), QIcon::Normal, QIcon::Off); icon[6].addFile(QString::fromUtf8(":/obrazky/Resources/cyan_field.png"), QSize(), QIcon::Normal, QIcon::Off); icon_empty.addFile(QString::fromUtf8(":/obrazky/Resources/empty_field.png"), QSize(), QIcon::Normal, QIcon::Off); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(dalsiTAH())); // automaticky spusti on_pushButtonTurn_clicked(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void MainWindow::qSleep(int ms) { #ifdef Q_OS_WIN Sleep(uint(ms)); #else struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; nanosleep(&ts, NULL); #endif } void MainWindow::ClrPole() { for(int y=0; y<MAX_Y; y++) for(int x=0; x<MAX_X; x++) { pole[x][y]=COLOR_UNDEF; ui->pushButton[x][y]->setIcon(icon_empty); } } // urci predchadzajuci prvok int MainWindow::TPred(int otoc) { if(otoc==0) otoc=3; else otoc=otoc-1; return otoc; } // urci nasledujuci prvok int MainWindow::TSucc(int otoc) { if(otoc==3) otoc=0; else otoc=otoc+1; return otoc; } // urci mensi prvok int MainWindow::Min(int a,int b) { if(a<b) return a; else return b; } // vykresli, zmaz, uloz kocku, alebo urci ci je mozne kocku polozit void MainWindow::Kocka(int xp,int yp,int typ,int otoc,int col, int option) { int x,y; int bod; // v cykle vygenerujeme jednotlive prvky kocky for(y=0; y<4; y++) for(x=0; x<4; x++) { switch(otoc) { case 0: bod = CUBE[typ][ x][ y]; break; case 1: bod = CUBE[typ][3-y][ x]; break; case 2: bod = CUBE[typ][3-x][3-y]; break; case 3: bod = CUBE[typ][ y][3-x]; break; } switch(option) { case OPT_CLR: // zmaze kocku if( bod==1 ) ui->pushButton[xp+x][yp+y]->setIcon(icon_empty); break; case OPT_PUT: // nakresli, zmaze kocku if( bod==1 ) ui->pushButton[xp+x][yp+y]->setIcon(icon[col]); break; case OPT_SAV: // ulozi kocku do pola if( bod==1 ) pole[x+xp][y+yp]=col; break; } // switch } // for } // zisti ci je mozne polozit kocku bool MainWindow::KockaOK(int xp, int yp, int typ, int otoc) { int x,y; int bod; bool res; // zatial si mysli ze kocku je mozne polozit res=true; // v cykle vygenerujeme jednotlive prvky kocky for(y=0; y<4; y++) for(x=0; x<4; x++) { switch(otoc) { case 0: bod = CUBE[typ][ x][ y]; break; case 1: bod = CUBE[typ][3-y][ x]; break; case 2: bod = CUBE[typ][3-x][3-y]; break; case 3: bod = CUBE[typ][ y][3-x]; break; } if( bod==1 ) { // hrube podmienky if((x+xp) <0 ) res=false; if((x+xp) >=MAX_X ) res=false; if((y+yp) >=MAX_Y ) res=false; if( otoc <0 ) res=false; if( otoc >3 ) res=false; // este ci je tam volne miesto if( res ) if( pole[x+xp][y+yp] != COLOR_UNDEF ) res=false; } // if } // for // moja odpoved return res; } // zmaze zaplneny riadok // a ostane posunie nadol void MainWindow::ZmazRiadok(int yr) { int x,y; // efekt postupneho mazania for(x=0; x<MAX_X; x++) { ui->pushButton[x][yr]->setIcon(icon_empty); qSleep(20); } // efekt padu riadkov for(y=yr; y>1; y--) for(x=0; x<MAX_X; x++) { pole[x][y]=pole[x][y-1]; // if( pole[x][y] == COLOR_UNDEF ) ui->pushButton[x][y]->setIcon(icon_empty); else ui->pushButton[x][y]->setIcon(icon[(int)pole[x][y]]); } } // skontroluje ktore riadky ma zmazat void MainWindow::Skontroluj(int yr) { int x,y; bool del; for(y=yr; y<Min(yr+4, MAX_Y); y++) { del=true; for(x=0; x<MAX_X; x++) if( pole[x][y] == COLOR_UNDEF ) del=false; if( del ) { ZmazRiadok(y); body=body+ui->horizontalScrollBar->value(); tlev=tlev+1; ui->label_3->setText(QString::number(body)); } } // ideme do dalsieho levelu if( body>=TO_LEV ) { tlev=0; ui->horizontalScrollBar->setValue( ui->horizontalScrollBar->value()+1); ui->label_3->setText(QString::number(body)); } } void MainWindow::on_pushButtonTurn_clicked() { if(y==0) { ClrPole(); x = (MAX_X / 2)-2; otoc = (rand() % 4); typ = 6; typ = (rand() % 7); col = (rand() % MAX_COLOR); y = 0; // bodovanie body =0; tlev =0; // zrus info ui->pushButtonTurn->setText(""); // nahodim timer timer->start(10*(101-ui->horizontalScrollBar->value())); return; } smer = SMER_OTOCR; } // vlevo void MainWindow::on_pushButtonDayDown_clicked() { smer = SMER_LEFT; } // vpravo void MainWindow::on_pushButtonDayUp_clicked() { smer = SMER_RIGHT; } void MainWindow::dalsiTAH() { // zmaz staru Kocka(x,y,typ,otoc,col,OPT_CLR); // podmienky otocit, vlavo, vpravo if((smer==SMER_LEFT) && KockaOK(x-1,y,typ,otoc)) x=x-1; if((smer==SMER_RIGHT) && KockaOK(x+1,y,typ,otoc)) x=x+1; if((smer==SMER_OTOCR) && KockaOK(x,y,typ,TPred(otoc))) otoc=TPred(otoc); if((smer==SMER_OTOCL) && KockaOK(x,y,typ,TSucc(otoc))) otoc=TSucc(otoc); // posuniem o riadok nizsie if( KockaOK(x,y+1,typ,otoc)) { y=y+1; } else { // kocka spadla Kocka(x,y,typ,otoc,col,OPT_PUT); Kocka(x,y,typ,otoc,col,OPT_SAV); Skontroluj(y); // zobraz /* for(y=0; y<MAX_Y; y++) for(x=0; x<MAX_X; x++) { if(pole[x][y] != COLOR_UNDEF) ui->pushButton[x][y]->setText(QString::number(pole[x][y])); } */ // niet kam polozit koncim, nerestartujem timer if( y==0 ) { ui->pushButtonTurn->setText("Press for start"); return; } // nova kocka x = (MAX_X / 2)-2; otoc = (rand() % 4); typ = (rand() % 7); col = (rand() % MAX_COLOR); y = 0; } // nakresli Kocka(x,y,typ,otoc,col,OPT_PUT); smer = SMER_NONE; // znova za timer timer->start(10*(101-ui->horizontalScrollBar->value())); }
Tento článok je pridaný so súhlasom autora :
TrSek alias Zdeno Sekerak
http://www.trsek.com